<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 每个原型对象中都有一个constructor属性，指回构造函数本身
        function Star(name, age) {
            this.name = name
            this.age = age
        }
        // Star.prototype.sing = function(){
        //     console.log('唱歌')
        // }
        // Star.prototype.dance = function(){
        //     console.log('dance')
        // }
        // Star.prototype.rap = function(){
        //     console.log('rap')
        // }
        // 1. 上述的方式给原型添加公共方法，不会修改原型。

        // 我们如果直接给Star.prototype赋值一个对象，这个时候，原型上的默认属性constructor就会丢失掉。
        // 我们可以手动给这个对象添加constructor属性，指回这个构造函数

        // 2. 这种以对象赋值的方式，会覆盖掉原型。 需要我们手动添加一个constructor属性
        Star.prototype = {
            constructor: Star, // 指回构造函数
            sing: function () {
                console.log('唱歌')
            },
            dance: function () {
                console.log('dance')
            },
            rap: function () {
                console.log('rap')
            }
        }

        const ldh = new Star('刘德华', 18)
        ldh.__proto__ === Star.prototype  // ==> 原型对象
        console.log(ldh)
        ldh.sing()
        ldh.dance()
    </script>
</body>

</html>